package com.sojson.util.linux;

import java.io.IOException;
import java.io.OutputStream;

import com.sojson.constant.Constant;

import cn.hutool.core.convert.Convert;

/**
 * 连接Linux工具类接口
 * 
 * @author liu
 * @Date 2020-06-15 14:45:16
 * @Description
 *
 */
public interface LinuxUtilInterface {

    String IP = Constant.PROPERTIES.getProperty("linux.ip");
    int PORT = Convert.toInt(Constant.PROPERTIES.getProperty("linux.port"), 22);
    String USERNAME = Convert.toStr(Constant.PROPERTIES.getProperty("spring.datasource.username"), "root");
    String PASSWORD = Convert.toStr(Constant.PROPERTIES.getProperty("spring.datasource.password"), "123456");

    /**
     * 让Linux服务器执行一段命令,多个命令用;分隔,返回服务器给的状态码
     * 状态码为null表示还没有返回状态码,如果一段命令要执行很长时间,提前获取的会是null
     * 
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    LinuxBean executiveCommandGetStatusCode(String comm, long timeOut) throws IOException;

    /**
     * 让Linux服务器执行一段命令,多个命令用;分隔,返回服务器给的状态码(长连接)
     * 状态码为null表示还没有返回状态码,如果一段命令要执行很长时间,提前获取的会是null
     * 
     * @param conn 连接对象
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    LinuxBean executiveCommandGetStatusCode(LinuxBean conn, String comm, long timeOut) throws IOException;

    /**
     * 执行Linux命令,返回读取到的字符串集合
     * 
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    LinuxBean executiveCommandGetStringList(String comm, long timeOut) throws IOException;

    /**
     * 执行Linux命令,返回读取到的字符串集合(长连接)
     * 
     * @param conn 连接对象
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    LinuxBean executiveCommandGetStringList(LinuxBean conn, String comm, long timeOut) throws IOException;

    /**
     * 执行Linux命令,返回读取到的字节流
     * 
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    LinuxBean executiveCommandGetInputStream(String comm, long timeOut) throws IOException;

    /**
     * 执行Linux命令,返回读取到的字节流(长连接)
     * 
     * @param conn 连接对象
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    LinuxBean executiveCommandGetInputStream(LinuxBean conn, String comm, long timeOut) throws IOException;

    /**
     * 执行Linux命令,上传文件
     * 
     * @param filePath 本地文件路径
     * @param targetPath 服务器文件路径
     * @throws IOException
     */
    void upload(String filePath, String targetPath) throws IOException;

    /**
     * 执行Linux命令,上传文件(长连接)
     * 
     * @param conn 连接对象
     * @param filePath 本地文件路径
     * @param targetPath 服务器文件路径
     * @throws IOException
     */
    void upload(LinuxBean conn, String filePath, String targetPath) throws IOException;

    /**
     * 执行Linux命令,上传文件
     * 
     * @param bytes 文件字节流
     * @param filePath 路径
     * @param fileName 文件名
     * @throws IOException
     */
    void upload(byte[] bytes, String filePath, String fileName) throws IOException;

    /**
     * 执行Linux命令,上传文件(长连接)
     * 
     * @param conn 连接对象
     * @param bytes 文件字节流
     * @param filePath 路径
     * @param fileName 文件名
     * @throws IOException
     */
    void upload(LinuxBean conn, byte[] bytes, String filePath, String fileName) throws IOException;

    /**
     * 执行Linux命令,删除文件
     * 
     * @param conn 连接对象
     * @param fileName 文件路径名
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    LinuxBean remove(String fileName, long timeOut) throws IOException;

    /**
     * 执行Linux命令,删除文件(长连接)
     * 
     * @param conn 连接对象
     * @param fileName 文件路径名
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    LinuxBean remove(LinuxBean conn, String fileName, long timeOut) throws IOException;

    /**
     * 执行Linux命令,下载文件
     * 
     * @param filePath 服务器文件路径
     * @param targetPath 本地文件路径
     * @throws IOException
     */
    void download(String filePath, String targetPath) throws IOException;

    /**
     * 执行Linux命令,下载文件(长连接)
     * 
     * @param conn 连接对象
     * @param filePath 服务器文件路径
     * @param targetPath 本地文件路径
     * @throws IOException
     */
    void download(LinuxBean conn, String filePath, String targetPath) throws IOException;

    /**
     * 执行Linux命令,下载文件
     * 
     * @param filePath 文件路径
     * @return
     * @throws IOException
     */
    OutputStream download(String filePath) throws IOException;

    /**
     * 执行Linux命令,下载文件(长连接)
     * 
     * @param conn 连接对象
     * @param filePath 文件路径
     * @return
     * @throws IOException
     */
    OutputStream download(LinuxBean conn, String filePath) throws IOException;

    /**
     * 获取连接对象
     * 
     * @return
     * @throws IOException
     */
    LinuxBean getConnection() throws IOException;

    /**
     * 获取连接对象
     * 
     * @param ip IP
     * @param password 密码
     * @return
     * @throws IOException
     */
    LinuxBean getConnection(String ip, String password) throws IOException;

    /**
     * 获取连接对象
     * 
     * @param ip IP
     * @param username 帐号
     * @param password 密码
     * @return
     * @throws IOException
     */
    LinuxBean getConnection(String ip, String username, String password) throws IOException;

    /**
     * 获取连接对象
     * 
     * @param ip IP
     * @param port 端口号
     * @param password 密码
     * @return
     * @throws IOException
     */
    LinuxBean getConnection(String ip, int port, String password) throws IOException;

    /**
     * 获取连接对象
     * 
     * @param ip IP
     * @param port 端口号
     * @param username 帐号
     * @param password 密码
     * @return
     * @throws IOException
     */
    LinuxBean getConnection(String ip, int port, String username, String password) throws IOException;

    /**
     * 关闭连接(单个连接)
     * 
     * @param conn 要关闭的对象
     * @throws IOException
     */
    void utilCloseOne(LinuxBean conn) throws IOException;

    /**
     * 关闭连接(一组连接)
     * 
     * @param conn 要关闭的对象集合
     * @throws IOException
     */
    void utilClose(LinuxBean conn) throws IOException;

    /**
     * 关闭连接(多组连接)
     * 
     * @param conn 要关闭的对象集合
     * @throws IOException
     */
    void utilCloseList(LinuxBean conn) throws IOException;

}